#pragma once
#include <cmath>

class ENUConverter
{
public:
    /**
     * 初始化参考点（仅需纬度和经度）
     * @param ref_lon 经度
     * @param ref_lat 纬度
     */
    ENUConverter(double ref_lon, double ref_lat);

    /**
     * 二维正向转换（忽略海拔输入）
     * @param lon        经度
     * @param lat        纬度
     * @param[out] east  物体东向坐标
     * @param[out] north 物体北向坐标
     */
    void Forward(double lon, double lat, double &east, double &north);

    /**
     * 二维逆向转换（忽略海拔输出）
     * @param east      物体东向坐标
     * @param north     物体北向坐标
     * @param[out] lon  经度
     * @param[out] lat  纬度
     */
    void Reverse(double east, double north, double &lon, double &lat);

private:
    // WGS84参数
    const double EARTH_A = 6378137.0;
    const double EARTH_F = 1.0 / 298.257223563;
    const double EARTH_E2 = EARTH_F * (2 - EARTH_F);

    // 参考点参数
    double ref_lat_rad, ref_lon_rad;
    double ref_x, ref_y, ref_z;
    double sin_lat, cos_lat, sin_lon, cos_lon;

    // 通用精度控制函数
    double roundToDecimal(double value, int decimal) const;

    // 三维转换方法（保持内部逻辑不变）
    void ForwardWithAltitude(double lat, double lon, double alt,
                             double &east, double &north, double &up);

    void ReverseWithAltitude(double east, double north, double up,
                             double &lat, double &lon, double &alt);

    // 修改后的ECEF转换（强制alt=0）
    void Wgs84ToEcef(double lat_rad, double lon_rad,
                     double &x, double &y, double &z);

    void EcefToWgs84(double x, double y, double z,
                     double &lat_rad, double &lon_rad, double &alt);
};